\documentclass{article}
\usepackage{ctex}
\usepackage{graphicx, subcaption}

% Language setting
% Replace `english' with e.g. `spanish' to change the document language
\usepackage[english]{babel}

% Set page size and margins
% Replace `letterpaper' with `a4paper' for UK/EU standard size
\usepackage[letterpaper,top=2cm,bottom=2cm,left=3cm,right=3cm,marginparwidth=1.75cm]{geometry}
\geometry{margin=1in}
% Useful packages
\usepackage{amsmath}
\usepackage[colorlinks=true, allcolors=blue]{hyperref}

% SQL语言
\usepackage{listings}
\usepackage{xcolor}

\begin{document}
	
	% 自定义标题页
	\begin{titlepage}
		\begin{center}
			\vspace*{1cm}
			
			% 实验标题
			\Huge
			\textbf{编译原理第五次实验}
			
			\vspace{0.5cm}
			
			\vspace{1.5cm}
			
			% 作者信息表格
			\Large
			\begin{tabular}{rl}
				姓名： & 侯浩然 \\
				班级： & 计算机2106 \\
				学号： & 2211314605 \\
			\end{tabular}
			
			\vfill
			
			% 实验日期
			\Large
			\today
			
		\end{center}
	\end{titlepage}
	
	\section{题目分析}
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.8\linewidth]{screenshot001}
		\caption{}
		\label{fig:screenshot001}
	\end{figure}
	
	在本次实验中，在上次实验代码的基础上，对代码进行补充，向文件output中输出四元式。
	
	\section{代码分析}
	
	首先在judge()函数判断之前，需要将变量都映射成字符i，不然会在judge的时候出错。下图中，对读如的ch字符进行判断，如果ch是输入的变量a,b或者c，则将ch赋值为i，以便通过judge检查。
	
	与此同时，将字符转变后会丢失字符原来的信息，所以需要使用一个额外的stack进行记录变量，也方便之后进行计算，所以这里将字符转化为字符串之后放到了stk的栈中。
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.7\linewidth]{screenshot002}
		\caption{}
		\label{fig:screenshot002}
	\end{figure}
	
	
\newpage
	
	接下来将会判断是进行移位还是规约，由于具有运算的步骤均在规约之中，所以我们可以到规约的函数中进行修改。
	
	在规约类型中，有一部分是不产生运算步骤的，所以需要根据SLR(1)分析表对能产生规约的步骤进行筛选，为了得到步骤编号，仍然需要进入Reduction函数进行操作。
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.9\linewidth]{screenshot003}
		\caption{}
		\label{fig:screenshot003}
	\end{figure}
	
	在Reduction函数中，直接在函数头部进行筛选，如果i的值为1,2,4,5,就分别对应了+，-，*，/四种运算，然后就进入自己的函数进行运算输出。
	
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.7\linewidth]{screenshot004}
		\caption{}
		\label{fig:screenshot004}
	\end{figure}
	
\newpage
	
	在此函数中，首先将stk栈中的栈顶两个元素取出，然后根据编号进行不同的运算，赋值给Ti，最后再把Ti压入栈中，将运算的输出写到文件中，自此完成整个流程。
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.85\linewidth]{screenshot005}
		\caption{}
		\label{fig:screenshot005}
	\end{figure}
		
\newpage		
	\section{运算结果}
	
	下图为测试集为：a+b+c+(a*a)
	
		\begin{figure}[tbph!]
			\centering
			\includegraphics[width=0.7\linewidth]{screenshot006}
			\caption{}
			\label{fig:screenshot006}
		\end{figure}
		
	下面的测试集为：a+b*c-a/b
	
	\begin{figure}[tbph!]
		\centering
		\includegraphics[width=0.7\linewidth]{screenshot007}
		\caption{}
		\label{fig:screenshot007}
	\end{figure}
	
\end{document}

















